다음 3가지 회귀분석 모형에 대해 질문을 읽고 답하세요. (m은 더미변수)
모형1: y = ax + bm + d
모형2: y = ax + cmx + d
모형3: y = ax + bm + cmx + d
각각의 기법이 주는 증거의 수준
더 높은 수준의 기법이 주는 결과는 더 진실에 가까움
모든 조건을 완벽하게 통제할 수 없을 경우, 실험군과 대조군에 무작위로 할당
충분히 큰 표본에서는 두 집단이 유사할 것
생물학, 사회과학 등에서 가능
→ 사람들의 동의를 얻기 어려워 무작위 대조군 방법은 사실상 어려움 (예, 코로나 바이러스 해독약 생체실험)
대조군이 없거나 무작위 할당이 되지 않았지만 실험과 비슷한 상황
자연적으로 무작위 할당과 비슷한 결과가 생긴 경우
예, TV 광고를 랜덤하게 송출하는 건 불가능 → 동네별로 차이두기(충북 충남은 큰 차이가 없으니, 두 지역에서 다른 광고 틀기)
이중차분법 등의 기법을 통해 분석
순수한 관찰 결과만을 가지고 인과관계를 추측 (반사실적 추론)
어떤 일이 벌어지지 않았을 때 일어질 있을 예측하는 모형이 필요
모형의 예측과 실제의 결과를 비교하여 영향력을 도출
A/B Test가 어려우면 준실험이라도, 준실험이 어려우면 반사실이라도!
(=상호작용)
같은 대상을 다른 시점간 비교
| 집단A | 집단B | 횡단비교 | |
|---|---|---|---|
| 시점 1 | A1 | B1 | A1 - B1 |
| 시점 2 | A2 | B2 | A2 - B2 |
| 종단비교 | A2 - A1 | B2 - B1 |
실험이 불가능한 상황에서 사용하는 준실험적 방법
실험군 A에 어떠한 처치를 했으나 대조군 B가 없을 때
A와 비슷한 집단 B를 이용하여 비교
| 집단A | 집단B | 횡단비교 | |
|---|---|---|---|
| 시점 1 | A1 | B1 | A1 - B1 |
| 시점 2 | A2 | B2 | A2 - B2 |
| 종단비교 | A2 - A1 | B2 - B1 | (A2 - A1) - (B2 - B1) |
"두 집단이 비슷한 추세를 나타내야 하는데, 한 집단이 두드러진 차이를 보인다면 그것이 처치한 것의 효과"
d = 0 : 실험군 A에서 변화는 대조군 B에서 변화와 비슷 (처치 효과 없음)
d != 0 : 실험군 A에서 대조군 B보다 큰 변화과 관찰 (처치 효과 있음)
처치 효과가 없다면 실험군 A와 대조군 B가 비슷하게 변할 것이라고 가정
이러한 가정이 성립하지 않는다면 이중차분법 적용이 불가능
가능한 A와 비슷한 B를 비교하는 것이 중요

상호작용을 통해 분석
$$ Y = a ⋅ GROUP + b ⋅ POINT + d ⋅ (GROUP × POINT) + e $$| A(GROUP=1) | B(GROUP=0) | 횡단비교 | |
|---|---|---|---|
| 전(POINT=0) | a + e | e | a |
| 후(POINT=1) | a + b + d + e | b + e | a + d |
| 종단비교 | b + d | b | d |
1992년 미국 뉴저지 주는 최저임금을 시간당 4.25달러에서 5.05달러로 인상
이웃 펜실베니아 주는 4.25달러 최저임금을 유지
두 주 경계에 위치한 패스트푸드 음식점을 대상으로 설문조사 실시
최저임금 상승이 사람을 고용에 미치는 영향을 측정
import pandas as pd
df = pd.read_excel('njmin3.xlsx')
df.head()
nj:d 의 계수를 통해 최저임금 인상이 고용에 미친 영향을 파악 가능
from statsmodels.formula.api import ols
ols('fte ~ nj * d', df).fit().summary()
y = - 2.9 nj - 2.2 d + 2.8 nj d + 23.3
| 뉴저지(nj=1) | 펜실베니아(nj=0) | 횡단비교 | |
|---|---|---|---|
| 전(POINT=0) | -2.9 + 23.3 | 23.3 | -2.9 |
| 후(POINT=1) | -2.9 - 2.2 + 2.8 + 23.3 | - 2.2 + 23.3 | -0.1 |
| 종단비교 | +0.6 | -2.2 | +2.8 |
최저임금전에는 뉴저지가 펜실베니아보다 고용이 2.9정도 낮았는데, 최저임금을 올린 후에는 격차가 2.9에서 0.1 정도로 줄었다.
그러나 이 데이터만으로는 최저임금 인상이 고용이 늘어난다는 결론을 내릴 수 없다. 통계적으로 유의하지 않다. 최저임금 인상이 고용이 줄어들게 하지는 않는다는 결론 정도는 내릴 수 있다.
from matplotlib import pyplot
def y(nj,d):
return 23.3312 - 2.8918 * nj + -2.1656 * d + 2.7536 * nj * d
x = [0, 1] # 가로축 지정
y_nj = [y(1,0), y(1,1)]
y_pen = [y(0,0), y(0,1)]
pyplot.plot(x, y_nj, 'r', y_pen, 'b--')
광고 전후 데이터 데이터에서,
group은 고객 집단을 나타냅니다. 광고집단 (1), 비교집단(0)
postAd는 광고 전(0), 후(1)를 나타냅니다.
sales는 매출액입니다.
광고 효과를 이중차분법으로 분석해보세요. 광고에 따른 매출액 변화는 얼마라고 할 수 있습니까?
df = pd.read_excel('postAd.xlsx')
df.head()
ols('sales ~ postAd * group', df).fit().summary()
y = -0.0253 group + 1.9897 postAd + 0.6186 postAd group + 2.0274
| 광고후(group=1) | 광고전(group=0) | 횡단비교 | |
|---|---|---|---|
| 전(postAd=0) | -0.0253 + 2.0274 | 2.0274 | -0.0253 |
| 후(postAd=1) | 1.9897 - 0.0253 + 0.6186 + 2.0274 | 1.9897 + 2.0274 | - 0.0253 + 0.6186 |
| 종단비교 | 1.9897 + 0.6186 | +1.9897 | +0.6186 |
광고에 따른 매출액 변화는 0.6186이고, 이는 유의수준 5%에서 통계적으로 유의하다.
time = [0,1]
sales_no_ad = [2.0274, 4.0171] # 비교 그룹에서 [광고 전, 광고 후]
sales_ad = [2.0021, 4.6104] # 광고 그룹에서 [광고 전, 광고 후]
from matplotlib import pyplot
pyplot.plot(time, sales_no_ad, 'b--')
pyplot.plot(time, sales_ad, 'r')
구글에서 발표한 반사실적 인과 추론 모형
ARIMA 모델은 추세가 일정할 때 쓰기 좋음. 그러나 매출, 고객 유입 데이터 등은 들쑥날쑥한 경향이 있어 이때 Casual Impact 활용.
from causalimpact import CausalImpact
df = pd.read_excel('causal_impact.xlsx')
df.head()
pyplot.plot(df['sales']) # 매출 추세 보기
pre_period = [0,69] # 광고 이전 시점
post_period = [70,99] # 광고 이후 시점
ci = CausalImpact(df, pre_period, post_period)
분석 시 주의할 점
ci.plot()
그림 크기를 조절하려면 ci.plot(figsize=(12, 6)) 와 같이 지정
아래는 출력할 패널을 지정하는 법
ci.plot(panels=['original', 'pointwise', 'cumulative'], figsize=(12,4))
print(ci.summary())
문장으로 풀어서 설명
print(ci.summary(output='report'))
광고 매출 데이터를 CausalImpact로 분석해보세요(84 이후). 누적 절대 효과는 얼마입니까?
from causalimpact import CausalImpact
ad = pd.read_excel('campaign.xlsx')
ad.tail()
pyplot.plot(ad['ad_costs'])
pre_period = [0,83] # 광고 이전 시점
post_period = [84,107] # 광고 이후 시점
ci = CausalImpact(ad, pre_period, post_period)
print(ci.summary())
정답: 229.43
지도 학습: X → Y의 관계를 학습 (정답을 잘 예측해야 함)
비지도 학습: X의 내재적 구조를 학습 (정답이 없음)→action이 좋으면 잘 된거고 아니면...잘됐는지 아닌지 알 수 없음..
비지도 학습의 종류:
!pip install plotly
import plotly.express as px
df = px.data.iris()
fig = px.scatter_3d(
df,
x='sepal_length',
y='sepal_width',
z='petal_width',
color='petal_length')
fig.show()
df.head()
from sklearn.cluster import KMeans
col = ['sepal_length','sepal_width','petal_length','petal_width']
X = df[col]
kmeans = KMeans(n_clusters=2, random_state=0).fit(X) # 클러스터의 개수 지정
kmeans.labels_
# 위에서 클러스터의 개수를 2개로 했기 때문에 두 집단으로 묶어짐
fig = px.scatter_3d(
df,
x='sepal_length',
y='sepal_width',
z='petal_width',
color=kmeans.labels_)
fig.show()
사례들이 군집의 중심에서 얼마나 가까운가? (낮을 수록 좋음. 0이 최선)
다른 군집과 얼마나 다른가? (높을 수록 좋음)
군집 내 제곱합(within-cluster sum-of-squares): "각 클러스터의 중심에서부터의 거리"
$$ \sum_{i} |x_{i} - μ_{i}|^2 $$import matplotlib.pyplot as plt
wcss = []
ks = list(range(2,11))
for k in ks:
kmeans = KMeans(n_clusters=k, random_state=0).fit(X)
wcss.append(kmeans.inertia_)
plt.plot(ks, wcss)
elbow method
cl = pd.read_excel('cluster.xlsx', index_col=0) # unnamed: 0 column 제거
cl.head()
px.scatter(cl,'x1','x2')
wcss = []
for k in ks:
kmeans = KMeans(n_clusters=k, random_state=0).fit(cl)
wcss.append(kmeans.inertia_)
plt.plot(ks, wcss)
정답: 4
군집을 4개로 나누었을 때 inertia는 얼마입니까?
wcss
정답: 212.00599621083478